"""数据存储模块的基本接口和实现类，用于处理原始数据、清洗后数据和模型训练数据的存储"""
"""
数据存储基础接口
定义所有存储类需要实现的通用接口
"""
from abc import ABC, abstractmethod
from typing import Dict, List, Any, Optional


class BaseStorage(ABC):
    """\数据存储基类，定义统一接口"""
    
    def __init__(self, config: Dict[str, Any]):
        """
        初始化存储类
        
        Args:
            config: 存储配置参数
        """
        self.config = config
        
    @abstractmethod
    def save(self, data: Any, collection_name: str, **kwargs) -> bool:
        """
        保存数据
        
        Args:
            data: 要保存的数据
            collection_name: 集合/表名称
            **kwargs: 其他参数
        
        Returns:
            bool: 保存是否成功
        """
        pass
        
    @abstractmethod
    def batch_save(self, data_list: List[Any], collection_name: str, **kwargs) -> bool:
        """
        批量保存数据
        
        Args:
            data_list: 数据列表
            collection_name: 集合/表名称
            **kwargs: 其他参数
        
        Returns:
            bool: 批量保存是否成功
        """
        pass
        
    @abstractmethod
    def query(self, collection_name: str, query_params: Dict[str, Any], **kwargs) -> List[Any]:
        """
        查询数据
        
        Args:
            collection_name: 集合/表名称
            query_params: 查询参数
            **kwargs: 其他参数
        
        Returns:
            List[Any]: 查询结果列表
        """
        pass
        
    @abstractmethod
    def update(self, collection_name: str, query_params: Dict[str, Any], update_data: Dict[str, Any], **kwargs) -> bool:
        """
        更新数据
        
        Args:
            collection_name: 集合/表名称
            query_params: 查询条件
            update_data: 更新数据
            **kwargs: 其他参数
        
        Returns:
            bool: 更新是否成功
        """
        pass
        
    @abstractmethod
    def delete(self, collection_name: str, query_params: Dict[str, Any], **kwargs) -> bool:
        """
        删除数据
        
        Args:
            collection_name: 集合/表名称
            query_params: 删除条件
            **kwargs: 其他参数
        
        Returns:
            bool: 删除是否成功
        """
        pass
        
    @abstractmethod
    def close(self):
        """\关闭连接"""
        pass


class StorageFactory:
    """存储工厂类，用于创建不同类型的存储实例"""
    _storage_implementations = {}
    
    @classmethod
    def register_storage(cls, storage_type: str, storage_class):
        """
        注册存储实现
        
        Args:
            storage_type: 存储类型
            storage_class: 存储类
        """
        cls._storage_implementations[storage_type] = storage_class
        
    @classmethod
    def create_storage(cls, storage_type: str, config: Dict[str, Any]) -> BaseStorage:
        """
        创建存储实例
        
        Args:
            storage_type: 存储类型
            config: 存储配置
        
        Returns:
            BaseStorage: 存储实例
        
        Raises:
            ValueError: 存储类型不存在
        """
        if storage_type not in cls._storage_implementations:
            raise ValueError(f"不支持的存储类型: {storage_type}")
        
        return cls._storage_implementations[storage_type](config)